package com.hss.backservice.service;

import android.app.job.JobParameters;
import android.app.job.JobService;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;
//http://www.cnblogs.com/blfshiye/p/5382154.html
/**
 * Created by Administrator on 2016/12/21.
 */

public class MyJobService extends JobService {
//    当任务開始时会运行onStartJob(JobParameters params)方法，由于这是系统用来触发已经被运行的任务。
//    假设返回值是false,系统假设这种方法返回时任务已经运行完成。
// 假设返回值是true,那么系统假定这个任务正要被运行，运行任务的重担就落在了你的肩上
// 当任务运行完成时你须要调用jobFinished(JobParameters params, boolean needsRescheduled)来通知系统。
    @Override
    public boolean onStartJob(JobParameters params) {
        mJobHandler.sendMessageDelayed( Message.obtain( mJobHandler, 1, params ),1000 );
//        if(isNetworkConnected()){
//            new WebDownLoadTask().execute(params);
//            return true;
//        }
        return true;
    }

//    当系统接收到一个取消请求时，系统会调用onStopJob(JobParameters params)方法取消正在等待运行的任务。
//非常重要的一点是假设onStartJob(JobParameters params)返回false,那么系统假定在接收到一个取消请求时已经没有正在运行的任务。
//    换句话说，onStopJob(JobParameters params)在这种情况下不会被调用。
//须要注意的是这个job service运行在你的主线程，这意味着你须要使用子线程，handler, 或者一个异步任务来运行耗时的操作以防止堵塞主线程。
    @Override
    public boolean onStopJob(JobParameters params) {
        Log.e("","onStopJob");
        mJobHandler.removeMessages( 1 );
        return false;
    }

    private Handler mJobHandler = new Handler(new Handler.Callback() {

        @Override
        public boolean handleMessage( Message msg ) {
            JobParameters parameters = (JobParameters) msg.obj;
            Toast.makeText( getApplicationContext(),
                    "JobService task running  job id = "+parameters.getJobId(), Toast.LENGTH_SHORT )
                    .show();
            jobFinished( (JobParameters) msg.obj, true );
            return true;
        }

    } );
//    当任务运行完成之后，你须要调用jobFinished(JobParameters params, boolean needsRescheduled)来让系统知道这个任务已经结束，系统能够将下一个任务加入到队列中。
// 假设你没有调用jobFinished(JobParameters params, boolean needsRescheduled)，你的任务仅仅会运行一次，而应用中的其它任务就不会被运行。
//
//    jobFinished(JobParameters params, boolean needsRescheduled)的两个參数中的params參数是从JobService的onStartJob(JobParameters params)的params传递过来的。
// needsRescheduled參数是让系统知道这个任务是否应该在最处的条件下被反复运行。这个boolean值非常实用，由于它指明了你怎样处理由于其它原因导致任务运行失败的情况，比如一个失败的网络请求调用。
//
//    创建了Handler实例之后。你就能够实现onStartJob(JobParameters params) 和onStopJob(JobParameters params)方法来控制你的任务了。
//
//    你可能已经注意到在以下的代码片段中onStartJob(JobParameters params)返回了true。这是由于你要通过Handler实例来控制你的操作，
//
//    这意味着Handler的handleMessage方法的运行时间可能比onStartJob(JobParameters params)更长。返回true,你会让系统知道你会手动地调用jobFinished(JobParameters params, boolean needsRescheduled)方法。

    private boolean isNetworkConnected(){

        ConnectivityManager connManager=(ConnectivityManager)this.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo=connManager.getActiveNetworkInfo();
        return (networkInfo!=null && networkInfo.isConnected());

    }

}
